package com.ymx.darling.spring.service;

import com.ymx.darling.dialect.page.Page;
import com.ymx.darling.mapper.EntityMapper;
import com.ymx.darling.wrapper.QueryWrapper;
import com.ymx.darling.wrapper.UpdateWrapper;

import java.io.Serializable;
import java.util.List;

/**
 * @author 爱Java的小于
 * @param <T>
 */
public interface IService<T> {
    /**
     * 返回EntityMapper
     * @return EntityMapper
     */
    EntityMapper<T> getEntityMapper();

    /**
     * 返回所有数据
     * @return list
     */
    List<T> getAll();

    /**
     *根据查询构造器返回多个数据
     * @param queryWrapper 查询构造器
     * @return list
     */
    List<T> getList(QueryWrapper queryWrapper);

    /**
     * 根据条件构造器查询多条数据
     * @param queryWrapper 查询构造器
     * @param asType 映射类型
     * @return list
     * @param <E> E
     */
    <E> List<E> getListAs(QueryWrapper queryWrapper, Class<E> asType);

    /**
     * 根据id返回一条记录
     * @param id id值
     * @return T
     */
    T getById(Serializable id);

    /**
     * 根据id批量查询数据
     * @param ids list
     * @return list
     */
    List<T> getByIds(List<? extends Serializable> ids);

    /**
     * 根据条件构造器返回一条记录
     * @param queryWrapper 查询构造器
     * @return T
     */
    T getOne(QueryWrapper queryWrapper);

    /**
     * 根据条件构造器查询一条数据
     * @param queryWrapper 查询构造器
     * @param asType 映射类型
     * @return E
     * @param <E> E
     */
    <E> E getOneAs(QueryWrapper queryWrapper, Class<E> asType);

    /**
     * 返回查询总记录数
     * @param queryWrapper 查询构造器
     * @return int
     */
    Integer getCount(QueryWrapper queryWrapper);

    /**
     * 返回总记录数
     * @return int
     */
    Integer getCount();

    /**
     * 返回Page实例
     * @param queryWrapper 查询构造器
     * @param pageNum 页码
     * @param pageSize 页的大小
     * @return page
     */
    Page<T> getPage(QueryWrapper queryWrapper, int pageNum, int pageSize);

    /**
     * 保存记录
     * @param entity 实体
     * @return boolean
     */
    boolean save(T entity);

    /**
     * 根据主键值去修改记录 主键在表中不存在则新增
     * @param entity 实体
     * @return boolean
     */
    boolean saveOrUpdate(T entity);

    /**
     * 根据id更新全部字段
     * @param entity entity
     * @return boolean
     */
    boolean update(T entity);

    /**
     * 根据id更新不为null的字段
     * @param entity entity
     * @return boolean
     */
    boolean updateAll(T entity);

    /**
     * 根据id删除
     * @param id serializable
     * @return boolean
     */
    boolean removeById(Serializable id);

    /**
     * 根据wrapper删除多个数据
     * @param wrapper updateWrapper
     * @return boolean
     */
    boolean removeByWrapper(UpdateWrapper wrapper);

    /**
     * 根据多个id查询多个数据
     * @param ids list
     * @return boolean
     */
    boolean removeByIds(List<? extends Serializable> ids);
}
